﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using DAL.Entity;
using DAL.Persistencia;

namespace NewTierra.Pages.Servicos
{
    public partial class ServicosConsulta : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
                PopularDrops();
            }
        }

        #region Popular Drops

        protected void PopularDrops()
        {
            PopularDDTipoServicoFiltro();
            PopularDDTipoServicoCategFiltro();
            PopularDDStatusFiltro();
            PopularddlStatusServico();
            PopularddlTipo();
            PopularddlTipoCateg();
            PopularddlPais();
            PopularddlCidade();
            PopularDDCidadeFiltro();
        }

        protected void PopularDDTipoServicoFiltro()
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    DDTipoServicoFiltro.DataSource = Con.S_Servicos_Tipo.ToList();
                    DDTipoServicoFiltro.DataValueField = "Tipo_Id";
                    DDTipoServicoFiltro.DataTextField = "Tipo_Nome";
                    DDTipoServicoFiltro.DataBind();

                    DDTipoServicoFiltro.Items.Insert(0, new ListItem("Todos","0"));
                }
            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void PopularDDTipoServicoCategFiltro()
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    int IdTipoServico = Convert.ToInt32(DDTipoServicoFiltro.SelectedValue);
                    ddlTipoServicoCategFiltro.DataSource = Con.S_Servicos_Tipo_Categ.Where(s => s.Tipo_Id == IdTipoServico).ToList();
                    ddlTipoServicoCategFiltro.DataValueField = "Tipo_categ_id";
                    ddlTipoServicoCategFiltro.DataTextField = "Tipo_categ_nome";
                    ddlTipoServicoCategFiltro.DataBind();

                    ddlTipoServicoCategFiltro.Items.Insert(0, new ListItem("Todos", "0"));
                }
            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void PopularDDStatusFiltro()
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    DDStatusFiltro.DataSource = Con.S_Status.ToList();
                    DDStatusFiltro.DataValueField = "STATUS_id";
                    DDStatusFiltro.DataTextField = "STATUS_nome";
                    DDStatusFiltro.DataBind();

                    DDStatusFiltro.Items.Insert(0, new ListItem("Todos", "0"));
                }
            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void PopularDDCidadeFiltro()
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    ddlCidadeServicoFiltro.DataSource = Con.Cidades.OrderBy(c => c.CID_nome).ToList();
                    ddlCidadeServicoFiltro.DataValueField = "CID_Id";
                    ddlCidadeServicoFiltro.DataTextField = "CID_nome";
                    ddlCidadeServicoFiltro.DataBind();

                    ddlCidadeServicoFiltro.Items.Insert(0, new ListItem("Todos", "0"));
                }
            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void PopularddlStatusServico()
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    ddlStatusServicos.DataSource = Con.S_Status.ToList();
                    ddlStatusServicos.DataValueField = "STATUS_id";
                    ddlStatusServicos.DataTextField = "STATUS_nome";
                    ddlStatusServicos.DataBind();
                }
            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void PopularddlTipo()
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    ddlTipoServico.DataSource = Con.S_Servicos_Tipo.ToList();
                    ddlTipoServico.DataValueField = "Tipo_Id";
                    ddlTipoServico.DataTextField = "Tipo_Nome";
                    ddlTipoServico.DataBind();
                }
            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void PopularddlTipoCateg()
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    int IdTipoServico = Convert.ToInt32(ddlTipoServico.SelectedValue);
                    ddlTipoServicoCateg.DataSource = Con.S_Servicos_Tipo_Categ.Where(s => s.Tipo_Id == IdTipoServico).ToList();
                    ddlTipoServicoCateg.DataValueField = "Tipo_categ_id";
                    ddlTipoServicoCateg.DataTextField = "Tipo_categ_nome";
                    ddlTipoServicoCateg.DataBind();

                    ddlTipoServicoCateg.Items.Insert(0, new ListItem("Nenhum", "0"));
                }
            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void PopularddlPais()
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    ddlPaisServicos.DataSource = Con.Pais.ToList();
                    ddlPaisServicos.DataValueField = "PAIS_id";
                    ddlPaisServicos.DataTextField = "PAIS_nome";
                    ddlPaisServicos.DataBind();
                }
            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void ddlPaisServicos_SelectedIndexChanged(object sender, EventArgs e)
        {
            PopularddlCidade();
        }

        protected void PopularddlCidade()
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    int IdPais = Convert.ToInt32(ddlPaisServicos.SelectedValue);
                    ddlCidadeServicos.DataSource = Con.Cidades.Where(c => c.PAIS_id == IdPais).OrderBy(c => c.CID_nome).ToList();
                    ddlCidadeServicos.DataValueField = "CID_id";
                    ddlCidadeServicos.DataTextField = "CID_nome";
                    ddlCidadeServicos.DataBind();
                }
            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        #endregion

        #region CRUD Servicos

        protected void CadastrarServico(object sender, EventArgs e)
        {
            ServicoDAL d = new ServicoDAL();

            if (txtCodServico.Text != "")
            {
                LimpaCampos(this.Controls);
                lblMsgCadServicos.Text = "";
                btnNovoServico.Text = "Salvar";
                PanelbtnsServico.Visible = false;
                EditorInfoLongServicos.Content = "";
                EditorInfoShortServicos.Content = "";
                Session.Abandon();
                txtNomeServico.Focus();                      
                return;
            }

            if (d.ObterPorNome(txtNomeServico.Text) != null)
            {
                lblMsgCadServicos.Text = "Já existe serviço cadastrado com esse nome, tente outro.";
                return;
            }

            try
            {
                S_Servicos s = new S_Servicos();

                s.Servicos_Nome = txtNomeServico.Text;
                s.Servicos_descr = EditorInfoLongServicos.Content;
                s.Servicos_descrCurt = EditorInfoShortServicos.Content;
                s.Servicos_descrRemarks = txtremarks.Text;
                s.Servicos_descrVoucher = txtInfoVoucher.Text;
                s.Servicos_descrCliente = txtInfoCliente.Text;
                s.STATUS_id = Convert.ToInt32(ddlStatusServicos.SelectedValue);
                s.Tipo_Id = Convert.ToInt32(ddlTipoServico.SelectedValue);
                s.Cid_Id = Convert.ToInt32(ddlCidadeServicos.SelectedValue);
                s.Pais_Id = Convert.ToInt32(ddlPaisServicos.SelectedValue);

                if(ddlTipoServicoCateg.SelectedValue.Equals("0"))
                { s.Tipo_categ_id = null; }
                else
                { s.Tipo_categ_id = Convert.ToInt32(ddlTipoServicoCateg.SelectedValue); }

                d.Salvar(s);
                LimpaCampos(this.Controls);
                lblMsgCadServicos.Text = "Serviço cadastrado com sucesso.";

            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void AtualizarServico(object sender, EventArgs e)
        {
            if (txtCodServico.Text == "")
            {
                lblMsgCadServicos.Text = "Selecione um serviço para ser atualizado.";
                return;
            }

            try
            {
                S_Servicos s = new S_Servicos();

                s.Servicos_Id = Convert.ToInt32(txtCodServico.Text);
                s.Servicos_Nome = txtNomeServico.Text;
                s.Servicos_descr = EditorInfoLongServicos.Content;
                s.Servicos_descrCurt = EditorInfoShortServicos.Content;
                s.Servicos_descrRemarks = txtremarks.Text;
                s.Servicos_descrVoucher = txtInfoVoucher.Text;
                s.Servicos_descrCliente = txtInfoCliente.Text;
                s.STATUS_id = Convert.ToInt32(ddlStatusServicos.SelectedValue);
                s.Tipo_Id = Convert.ToInt32(ddlTipoServico.SelectedValue);
                s.Cid_Id = Convert.ToInt32(ddlCidadeServicos.SelectedValue);
                s.Pais_Id = Convert.ToInt32(ddlPaisServicos.SelectedValue);

                if (ddlTipoServicoCateg.SelectedValue.Equals("0"))
                { s.Tipo_categ_id = null; }
                else
                { s.Tipo_categ_id = Convert.ToInt32(ddlTipoServicoCateg.SelectedValue); }

                ServicoDAL d = new ServicoDAL();
                d.Atualizar(s);
                //LimpaCampos(this.Controls);
                lblMsgCadServicos.Text = "Serviço atualizado com sucesso.";

            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void ExcluirServico(object sender, EventArgs e)
        {
            if (txtCodServico.Text == "")
            {
                lblMsgCadServicos.Text = "Selecione um serviço para ser excluído.";
                return;
            }

            if (!ExcluiFotoPasta())
            {
                lblMsgCadServicos.Text = "Não foi possível deletar as fotos na pasta 'Galeria/Servicos' por favor tente novamente.";
                return;
            }

            try
            {
                ServicoDAL s = new ServicoDAL();
                S_Servicos si = s.ObterPorId(Convert.ToInt32(txtCodServico.Text));
                s.Excluir(si);
                Session.Abandon();
                LimpaCampos(this.Controls);
                PanelbtnsServico.Visible = false;
                lblMsgCadServicos.Text = "Serviço excluído com sucesso.";

            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        public bool ExcluiFotoPasta()
        {
            try
            {
                FotoServicoDAL f = new FotoServicoDAL();

                foreach (Servicos_Imagem p in f.ListarTodosLista(Convert.ToInt32(txtCodServico.Text)))
                {
                    string path = "/Galeria/Servicos/" + Session["IdServico"] + "/" + p.Serv_img_nome;
                    System.IO.File.Delete(Server.MapPath(path));
                }
                return true;
            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
                return false;
            }
        }

        #endregion

        #region Regras

        [WebMethod]
        public static List<string> SearchServicos(string prefixText)
        {
            using (NewTierraEntities Con = new NewTierraEntities())
            {
                int idStatus = Convert.ToInt32(HttpContext.Current.Session["IDsFiltroStatusServicos"]);
                int idTipoServico = Convert.ToInt32(HttpContext.Current.Session["IDsFiltroTipoServicos"]);
                int idTipoCategServico = Convert.ToInt32(HttpContext.Current.Session["IDsFiltroTipoCategServicos"]);
                int idCidade = Convert.ToInt32(HttpContext.Current.Session["IDsFiltroCidadeServico"]);

                List<S_Servicos> s = new List<S_Servicos>();

                if (idTipoServico > 0 && idStatus > 0 && idTipoCategServico > 0 && idCidade > 0)
                    {
                        s = Con.S_Servicos.Where(p => p.Servicos_Nome.Contains(prefixText)
                                            && p.Tipo_Id == idTipoServico
                                            && p.STATUS_id == idStatus
                                            && p.Tipo_categ_id == idTipoCategServico
                                            && p.Cid_Id == idCidade).ToList();
                    }
                else if (idTipoServico > 0 && idTipoCategServico == 0)
                        {
                            s = Con.S_Servicos.Where(p => p.Servicos_Nome.Contains(prefixText) && p.Tipo_Id == idTipoServico).ToList();
                        }
                else if (idStatus > 0)
                        {
                            s = Con.S_Servicos.Where(p => p.Servicos_Nome.Contains(prefixText) && p.STATUS_id == idStatus).ToList();
                        }
                else if (idCidade > 0)
                {
                    s = Con.S_Servicos.Where(p => p.Servicos_Nome.Contains(prefixText) && p.Cid_Id == idCidade).ToList();
                }
                else if (idTipoServico > 0 && idTipoCategServico > 0)
                {
                    s = Con.S_Servicos.Where(p => p.Servicos_Nome.Contains(prefixText) && p.Tipo_Id == idTipoServico
                                                                                       && p.Tipo_categ_id == idTipoCategServico).ToList();
                }
                else
                    {
                        s = Con.S_Servicos.Where(p => p.Servicos_Nome.Contains(prefixText)).ToList();
                    }


                List<string> lista = new List<string>();

                foreach (S_Servicos p in s)
                {
                    lista.Add(p.Servicos_Nome);
                }

                return lista;
            }
        }       

        protected void ddlTipoServico_SelectedIndexChanged(object sender, EventArgs e)
        {
            PopularddlTipoCateg();
        }
       
        protected void DDStatusFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DDStatusFiltro.SelectedValue.Equals("0"))
            {
                Session["IDsFiltroStatusServicos"] = 0;
            }
            else
            {
                Session["IDsFiltroStatusServicos"] = DDStatusFiltro.SelectedValue;
            }
        }

        protected void DDTipoServicoFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            PopularDDTipoServicoCategFiltro();

            if (DDTipoServicoFiltro.SelectedValue.Equals("0"))
            {
                Session["IDsFiltroTipoServicos"] = 0;
            }
            else
            {
                Session["IDsFiltroTipoServicos"] = DDTipoServicoFiltro.SelectedValue;
            }
        }

        protected void DDCidadeServicoFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ddlCidadeServicoFiltro.SelectedValue.Equals("0"))
            {
                Session["IDsFiltroCidadeServico"] = 0;
            }
            else
            {
                Session["IDsFiltroCidadeServico"] = ddlCidadeServicoFiltro.SelectedValue;
            }
        }

        protected void DDTipoServicoCategFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DDTipoServicoFiltro.SelectedValue.Equals("0"))
            {
                Session["IDsFiltroTipoCategServicos"] = 0;
            }
            else
            {
                Session["IDsFiltroTipoCategServicos"] = ddlTipoServicoCategFiltro.SelectedValue;
            }
        }

        protected void CarregarServicoNome(object sender, EventArgs e)
        {
            try
            {
                ServicoDAL s = new ServicoDAL();
                S_Servicos ss = s.ObterPorNome(txtServicos.Text);
                PanelbtnsServico.Visible = true;
                txtServicos.Text = "";
                lblMsgCadServicos.Text = "";
                btnNovoServico.Text = "Novo";

                Session["nomeServico"] = ss.Servicos_Nome;
                Session["IdServico"] = ss.Servicos_Id;
                lblServicoNomeTituloTXT.Text = ss.Servicos_Nome;
                txtCodServico.Text = ss.Servicos_Id.ToString();
                txtNomeServico.Text = ss.Servicos_Nome;
                EditorInfoLongServicos.Content = ss.Servicos_descr;
                EditorInfoShortServicos.Content = ss.Servicos_descrCurt;
                txtremarks.Text = ss.Servicos_descrRemarks;
                txtInfoVoucher.Text = ss.Servicos_descrVoucher;
                txtInfoCliente.Text = ss.Servicos_descrCliente;
                ddlStatusServicos.SelectedValue = ss.STATUS_id.ToString();
                ddlTipoServico.SelectedValue = ss.Tipo_Id.ToString();
                ddlPaisServicos.SelectedValue = ss.Pais_Id.ToString();
                PopularddlCidade();
                ddlCidadeServicos.SelectedValue = ss.Cid_Id.ToString();

                if (ss.Tipo_categ_id != null)
                { ddlTipoServicoCateg.SelectedValue = ss.Tipo_categ_id.ToString(); }
                else
                { ddlTipoServicoCateg.SelectedValue = "0"; }

            }
            catch (Exception ex)
            {
                lblMsgCadServicos.Text = ex.Message;
            }
        }

        protected void LimparServico(object sender, EventArgs e)
        {
            {
                //LimpaCampos(Controls);
                Session.Abandon();
                Response.Redirect("ServicosConsulta.aspx");
            }

        }

        protected void LimpaCampos(ControlCollection controls)
        {
            foreach (Control ctrl in controls)
            {
                if (ctrl is TextBox)
                {
                    (ctrl as TextBox).Text = string.Empty;
                }
                // ... demais controles que queira limpar

                LimpaCampos(ctrl.Controls);
            }
        }
        
        #endregion

    }
}